'''
Created on 14/05/2013

@author: jean
'''
from pm import app
from . import jsonifiedview
from flask import request
from pm.database import db
from . import ensureParams
from pm.models.Fases import Fases
from pm.models.LineaBase import LineaBase
from pm.models.Items import Items
from sqlalchemy.orm.exc import NoResultFound
import simplejson

@app.route('/lineabase/generar', methods=['GET', 'POST'])
@jsonifiedview
def generarLineaBase():
    """
        metodo que genera una linea base
        @param listaItems: lista de los items que perteneceran a esta linea base
    """
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = {}
    if not ensureParams(params, ['lista_items']): 
        response = {"success" : False , "msg" : "Parametros Insuficientes!!"} 
        return response
    band = False
    print params ['lista_items']
    try:
        identificadores= simplejson.loads(params['lista_items'])
        for id_items in identificadores:
            i = Items.query.filter(Items.id_item == id_items).one()
            if i.estado != 2 and i.estado != 5:   
                response ={"success" : False , "msg" : "Uno de los items no se encuentra en estado aprobado"} 
                return response
            
        for id_item in identificadores:
            if band == False:
                itemAux= Items.query.filter(Items.id_item == id_item).one()
                if itemAux.estado == 5 or itemAux.estado== 2: 
                    fases= Fases.query.filter(Fases.id_fase == itemAux.id_fase).one()
                    if fases.estado==3 :
                        response = {"success" : False , "msg" : "No se pueden crear mas lineas bases en una fase terminada"} 
                        return response
                    if fases.estado==1:
                        fases.estado= 2
                    
                    fases.query.filter(Fases.id_fase == itemAux.id_fase).update({'cantidad_lb': fases.cantidad_lb +1})
                    db.session.commit()
                    descripcionLB = 'F'+ str(fases.posicion) + '-LB'+ str(fases.cantidad_lb)
                    lineaBase= LineaBase(descripcionLB, 1)
                    db.session.add(lineaBase)
                    db.session.commit()
                    band = True
            item= Items.query.filter(Items.id_item == id_item).update({'id_linea_base': lineaBase.id_linea_base, 'estado': 3})
            db.session.commit()
        response ={"success" : True , "msg" : "Creacion exitosa"} 
        return response    
    except Exception, e:
        NoResultFound
        db.session.rollback()
        response ={"success" : False , "msg" :"Error en la Base de Datos" + str(e)}
        return response 
    
@app.route('/lineabase/listar', methods=['GET', 'POST'])
@jsonifiedview
def listarLineaBase():
    """
        metodo que lista las lineas Base de una fase
        @param id_fase: el id de la fase de la cual se consultara las lB
    """
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = []
    if not ensureParams(params, ['id_fase']): 
        return response
 
    items = Items.query.filter(Items.id_fase == params['id_fase']).all()
    for i in items: 
        lineaBase =  LineaBase.query.filter(LineaBase.id_linea_base == i.id_linea_base).all()
        for lb in lineaBase: 
            if lb not in response:
                response.append(lb)
        
    return response
    

@app.route('/lineabase/listaritemsdistinct', methods=['GET', 'POST'])
@jsonifiedview
def listarItemsDistinctByFase():
    """
        metodo que lista las items dentro de una fase que no estan en una linea base
        @param id_fase: el id de la fase de la cual se consultara los items
    """
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = []
    if not ensureParams(params, ['id_fase']): 
        response = []
        return response
    
    items = Items.query.filter(Items.id_fase == params['id_fase']).filter(Items.id_linea_base == None).all()
    for i in items:
        response.append(i)
    return response

@app.route('/lineabase/listaritemsbylb', methods=['GET', 'POST'])
@jsonifiedview
def listarItemsByLB():
    """
        metodo que lista las items de una linea base
        @param id_linea_base: el id de la linea base de la cual se veran sus items
    """
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = []
    if not ensureParams(params, ['id_linea_base']): 
        response = []
        return response
    
    items = Items.query.filter(Items.id_linea_base == params['id_linea_base']).all()
    for i in items:
        response.append(i)
        
    return response

@app.route('/lineabase/eliminar', methods=['GET', 'POST'])
@jsonifiedview
def eliminarLineaBase():
    """
        metodo que lista las items de una linea base
        @param id_linea_base: el id de la linea base de la cual se veran sus items
    """
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = {}
    if not ensureParams(params, ['id_linea_base']): 
        response = {"success" : False , "msg" : "Parametros Insuficientes!!"} 
        return response
    try:
        lineaBase= LineaBase.query.filter(LineaBase.id_linea_base == params['id_linea_base']).one()
        lineaBase.query.filter(LineaBase.id_linea_base == params['id_linea_base']).update({'estado': 4})
        itemsAux = Items.query.filter(Items.id_linea_base == lineaBase.id_linea_base).first()
        fase = Fases.query.filter(Fases.id_fase == itemsAux.id_fase).one()
        fase.cantidad_lb = fase.cantidad_lb - 1 
        items = Items.query.filter(Items.id_linea_base == lineaBase.id_linea_base).update({'id_linea_base': None, 'estado': 2})  
        db.session.commit()
        response = {"success" : True , "msg" : "Eliminacion Exitosa"} 
        return response
    except Exception, e:
        db.session.rollback()
        response = {"success" : False , "msg" : "Error en la base de datos"} 
        return response
    
    
@app.route('/lineabase/revisado', methods=['GET', 'POST'])
@jsonifiedview
def LineaBaseRevisado():
    """
        metodo que vuelve a poner Lineas Bases en estado revisado a estado cerrado
        y modifica el estado de los items a cerrado.
        @param id_linea_base: el id de la linea base de la cual se modificara su estado y el de sus items
    """
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = {}
    if not ensureParams(params, ['id_linea_base']): 
        response = {"success" : False , "msg" : "Parametros Insuficientes!!"} 
        return response
    try:
        
        lineaBase= LineaBase.query.filter(LineaBase.id_linea_base == params['id_linea_base']).one()
        if lineaBase.estado != 3:
            response = {"success" : False , "msg" : "La Linea Base no se encuentra en estado Revision-Bloq"} 
            return response
        
        lineaBase.query.filter(LineaBase.id_linea_base == params['id_linea_base']).update({'estado': 1})
        itemsAux = Items.query.filter(Items.id_linea_base == lineaBase.id_linea_base).first()
        fase = Fases.query.filter(Fases.id_fase == itemsAux.id_fase).one()
        fase.cantidad_lb = fase.cantidad_lb + 1
        db.session.commit() 
        itemModEstado = Items.query.filter(Items.id_linea_base == lineaBase.id_linea_base).all()
        for ime in itemModEstado:
            items = Items.query.filter(Items.id_item == ime.id_item).update({'estado': 3})  
            db.session.commit()
        itemCerrarFase = Items.query.filter(Items.id_fase==fase.id_fase).all()
        estacerrado = True
        for icf in itemCerrarFase:
            lineaBaseCerrada = LineaBase.query.filter(LineaBase.id_linea_base==icf.id_linea_base).one()
            if lineaBaseCerrada.estado !=1:
                estacerrado = False
        if estacerrado== True:
            faseCerrar = Fases.query.filter(Fases.id_fase == itemsAux.id_fase).update({'estado': 3})
            db.session.commit()
        response = {"success" : True , "msg" : "La Linea Base se ha vuelto a cerrar exitosamente"} 
        return response
    except Exception, e:
        db.session.rollback()
        response = {"success" : False , "msg" : "Error en la base de datos"} 
        return response